#ifndef __DOUBLELINKLIST_H__
#define __DOUBLELINKLIST_H__

#include <stddef.h>
using ElementType = int;

class DoubleLinkList
{
public:
    // 无参构造
    DoubleLinkList();
    // 尾插
    void InsertTail(const ElementType &element);
    // 头插
    void InsertHead(const ElementType &element);
    // 中间插
    void InsertByIndex(int index, const ElementType &element);
    // 按位置删
    void RemoveByIndex(int index);
    // 按值删
    void RemoveByElement(const ElementType &element);
    // 按值修改
    void UpDateByElement(const ElementType &oldValue, const ElementType &newValue);
    // 重载 []
    ElementType &operator[](int index);
    // 按值查找
    size_t FindByElement(const ElementType &element);
    // 排序
    void Sort();
    // 归并
    DoubleLinkList Merge(const DoubleLinkList &element);
   
   
    size_t Size();
    // show
    void show();
    // 逆序
    void ReserveShow();

private:
    struct Node
    {
        Node(const ElementType &element):value(element), next(nullptr), prev(nullptr){}
        ElementType value;
        Node *next;
        Node *prev;
    };
    // 快排
    void FastSort(Node *head, Node *tail);
    Node *head; // 头指针
    Node *tail; // 尾指针
    size_t size;
};

#endif